package br.com.news.web;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

import br.com.news.utils.database.beans.AcessoNoticiaBean;
import br.com.news.utils.database.beans.CategoriaBean;
import br.com.news.utils.database.beans.CategoriaUsuarioBean;
import br.com.news.utils.database.beans.NoticiaBean;

@ViewScoped
@ManagedBean
public class NoticiaMB extends BaseMB implements Serializable {

	private static final long	serialVersionUID	= -4097022516654744018L;

	private List<Integer> paginacao;
	private boolean before;
	private boolean next;
	
	private String nomeNoticia;

	private List<NoticiaBean> noticias;
	private Boolean mostrarNoticia;
	private NoticiaBean noticiaSelecionada;
	private String textoNoticiaSelecionada;
	private List<CategoriaBean> categoriasMaisAcessadas;
	private List<AcessoNoticiaBean> maisLidasDaSemana;
	private long idCategoriaL;
	private Integer paginaSelecionada;

	public NoticiaMB() {
		
		
		String idNoticia = getValueParameter("Id");
		String idCategoria = getValueParameter("IdCategoria");
		idCategoriaL = 0;
		if (idCategoria != null && !idCategoria.equals("")) {
			idCategoriaL = Long.parseLong(idCategoria);
		}
		
		
		if (idNoticia != null && !idNoticia.equals("")) {
			selecionarNoticia(getNoticia().findById(Long.parseLong(idNoticia)));
		}
		
		noticias = getNoticia().lastNews(10, 0, idCategoriaL);
		
		carregaPaginacao(idCategoriaL);
		
		categoriasMaisAcessadas = getCategoriaService().categoriasMaisAcessadas();
		
		maisLidasDaSemana = getAcessoNoticiaservice().maisLidasDaSemana(10, 0);
	}
	
	public List<CategoriaUsuarioBean> getCategoriasDoUsuario() {
		return new ArrayList<CategoriaUsuarioBean>();
		
	}
	
	public void carregaPaginacao(long idCategoria) {
		FacesContext facesContext = FacesContext.getCurrentInstance();
		String page = (String) facesContext.getExternalContext().
        getRequestParameterMap().get("page");
		mostrarNoticia = false;
		
		if (page == null || page.equals("")) {
			paginacao = new ArrayList<Integer>();
			int quantidade = getNoticia().quantidadePaginas(idCategoria) / 10;
			before = false;
			paginaSelecionada = 1;
			for (int i=1;i<=quantidade;i++) {
				if (i>10) {
					next = true;
					break;
				}
				paginacao.add(i);
			}
		}
	}
	
	public String selecionarPagina(int pagina) {
		mostrarNoticia = false;
		paginaSelecionada = pagina;
		if (pagina == 1) {
			noticias = getNoticia().noticiasByPagina(1,idCategoriaL , 10);
		} else {
			
			noticias = getNoticia().noticiasByPagina(pagina*10, idCategoriaL , 10);
		}
		
		return null;
		
	}
	
	public void voltar() {
		mostrarNoticia = false;
	}
	
	public void proximo() {
		mostrarNoticia = false;
		if (paginacao.size() != 0) {
			int posicao = paginacao.get(paginacao.size() - 1) + 1;
			paginacao = new ArrayList<Integer>();
			int quantidade = getNoticia().quantidadePaginas(idCategoriaL) / 10;
			paginacao.clear();
			before = true;
			next = false;
			paginaSelecionada = posicao;
			for (int i=posicao;i<=quantidade;i++) {
				if (i>posicao+9) {
					next = true;
					break;
				}
				paginacao.add(i);
			}
			selecionarPagina(posicao);
		}
	}
	
	public void anterior() {
		mostrarNoticia = false;
		if (paginacao.size() != 0) {
			int posicao = paginacao.get(0) - 10;
			paginacao = new ArrayList<Integer>();
			int quantidade = getNoticia().quantidadePaginas(idCategoriaL) / 10;
			paginacao.clear();
			before = true;
			next = false;
			paginaSelecionada = posicao;
			for (int i=posicao;i<=quantidade;i++) {
				if (i>posicao+9) {
					next = true;
					break;
				}
				paginacao.add(i);
			}
			selecionarPagina(posicao);
		}
	}
	
	public void selecionarNoticia(NoticiaBean noticia) {
		if (noticia != null && noticia.getIdNoticia() != 0) {
			mostrarNoticia = true;
			noticiaSelecionada = noticia;
			
			textoNoticiaSelecionada = getNoticia().returnTextNew(noticia.getIdNoticia());
			
			AcessoNoticiaBean acessoNoticiaBean = new AcessoNoticiaBean();
			acessoNoticiaBean.setNoticia(noticia);
			acessoNoticiaBean.setDataCriacao(new Date());
			acessoNoticiaBean.setIp(pegarIp());
			
			getAcessoNoticiaservice().save(acessoNoticiaBean);
		}
	}
	
	public void buscarNoticia() {
		if (nomeNoticia != null && !nomeNoticia.equals("")) {
			noticias = getNoticia().buscaNoticiaPorNome(nomeNoticia);
			nomeNoticia = "";
			mostrarNoticia = false;
		}
	}
	
	public String pegarIp() {  
		  
	    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();  
	    String ip = request.getRemoteAddr();  
	  
	    return ip;  
	}  

	public List<NoticiaBean> getNoticias() {
		return  noticias;
	}

	public void setNoticias(List<NoticiaBean> noticias) {
		this.noticias = noticias;
	}

	public Boolean getMostrarNoticia() {
		return mostrarNoticia;
	}

	public void setMostrarNoticia(Boolean mostrarNoticia) {
		this.mostrarNoticia = mostrarNoticia;
	}


	public NoticiaBean getNoticiaSelecionada() {
		return noticiaSelecionada;
	}

	public void setNoticiaSelecionada(NoticiaBean noticiaSelecionada) {
		this.noticiaSelecionada = noticiaSelecionada;
	}

	public String getTextoNoticiaSelecionada() {
		return textoNoticiaSelecionada;
	}

	public void setTextoNoticiaSelecionada(String textoNoticiaSelecionada) {
		this.textoNoticiaSelecionada = textoNoticiaSelecionada;
	}

	public List<CategoriaBean> getCategoriasMaisAcessadas() {
		return categoriasMaisAcessadas;
	}

	public void setCategoriasMaisAcessadas(
			List<CategoriaBean> categoriasMaisAcessadas) {
		this.categoriasMaisAcessadas = categoriasMaisAcessadas;
	}

	public List<AcessoNoticiaBean> getMaisLidasDaSemana() {
		return maisLidasDaSemana;
	}

	public void setMaisLidasDaSemana(List<AcessoNoticiaBean> maisLidasDaSemana) {
		this.maisLidasDaSemana = maisLidasDaSemana;
	}

	public List<Integer> getPaginacao() {
		return paginacao;
	}

	public void setPaginacao(List<Integer> paginacao) {
		this.paginacao = paginacao;
	}

	public boolean isBefore() {
		return before;
	}

	public void setBefore(boolean before) {
		this.before = before;
	}

	public boolean isNext() {
		return next;
	}

	public void setNext(boolean next) {
		this.next = next;
	}

	public String getNomeNoticia() {
		return nomeNoticia;
	}

	public void setNomeNoticia(String nomeNoticia) {
		this.nomeNoticia = nomeNoticia;
	}

	public long getIdCategoriaL() {
		return idCategoriaL;
	}

	public void setIdCategoriaL(long idCategoriaL) {
		this.idCategoriaL = idCategoriaL;
	}

	public Integer getPaginaSelecionada() {
		return paginaSelecionada;
	}

	public void setPaginaSelecionada(Integer paginaSelecionada) {
		this.paginaSelecionada = paginaSelecionada;
	}
	
}
